home *** CD-ROM | disk | FTP | other *** search
/ Meeting Pearls 1 / Meeting Pearls Vol 1 (1994).iso / installed_progs / hard / galer / source / src.lha / Source / GALer / Reasm.c < prev    next >
Encoding:
C/C++ Source or Header  |  1993-11-10  |  36.9 KB  |  1,358 lines

  1. /****************************************************************/
  2. /*                                */
  3. /* Reasm.c - this file includes the Reassembler            */
  4. /*                                */
  5. /*                                */
  6. /****************************************************************/
  7.  
  8.  
  9. #include <exec/memory.h>
  10. #include <libraries/dos.h>
  11. #include <intuition/intuition.h>
  12. #include <intuition/gadgetclass.h>
  13. #include <libraries/gadtools.h>
  14. #include <libraries/locale.h>
  15. #include <ctype.h>
  16. #include <string.h>
  17.  
  18. #include <proto/locale.h>
  19. #include <proto/reqtools.h>
  20. #include <proto/intuition.h>
  21. #include <proto/gadtools.h>
  22. #include <proto/exec.h>
  23. #include <proto/dos.h>
  24.  
  25. #include "GALer.h"
  26. #include "Localize.h"
  27.  
  28.  
  29.  
  30. /**************************** defines  *********************************/
  31.  
  32. #define GD_RAsmGad01        1    /* GadgetID muß mit Pinnummer */
  33. #define GD_RAsmGad02        2    /* übereinstimmen */
  34. #define GD_RAsmGad03        3
  35. #define GD_RAsmGad04        4
  36. #define GD_RAsmGad05        5
  37. #define GD_RAsmGad06        6
  38. #define GD_RAsmGad07        7
  39. #define GD_RAsmGad08        8
  40. #define GD_RAsmGad09        9
  41. #define GD_RAsmGad10        10
  42. #define GD_RAsmGad11        11
  43. #define GD_RAsmGad12        12
  44. #define GD_RAsmGad13        13
  45. #define GD_RAsmGad14        14
  46. #define GD_RAsmGad15        15
  47. #define GD_RAsmGad16        16
  48. #define GD_RAsmGad17        17
  49. #define GD_RAsmGad18        18
  50. #define GD_RAsmGad19        19
  51. #define GD_RAsmGad20        20
  52. #define GD_RAsmGad21        21
  53. #define GD_RAsmGad22        22
  54. #define GD_RAsmGad23        23
  55. #define GD_RAsmGad24        24
  56.  
  57. #define GD_RAsmGad30        30
  58. #define GD_RAsmGad31        31
  59. #define GD_RAsmGad32        32
  60. #define GD_RAsmGad33        33
  61.  
  62.  
  63.  
  64.  
  65.  
  66. /************************** extern variables ****************************/
  67.  
  68. extern    struct  AppString { LONG   as_ID;
  69.                  STRPTR as_Str;
  70.               };
  71.  
  72. extern    struct  AppString AppStrings[];
  73.  
  74. extern    int OLMCSize22V10[];
  75.  
  76. extern    int ToOLMC20RA10[];
  77.  
  78.  
  79. extern    char    path[];
  80. extern    int    JedecGALType;
  81. extern    char    filename[];            /*Puffer für Filenamen*/
  82. extern    struct    JedecStruct    Jedec;
  83. extern    struct    Window        *window;
  84. extern    struct    Screen        *screen;
  85. extern    struct    Gadget        *RAsm16GList, *RAsm20GList;
  86. extern    struct    Catalog        *catalog;
  87.  
  88.  
  89.  
  90.  
  91.  
  92. /*************************** variables  *********************************/
  93.  
  94.  
  95.                     /* this vectors show which column of */
  96.                     /* the logic array is connected to */
  97.                     /* which pin */
  98. int FuseToPin16Mode1[] = { 2,1,3,19,4,18,5,17,6,14,7,13,8,12,9,11 };
  99. int FuseToPin16Mode2[] = { 2,1,3,18,4,17,5,16,6,15,7,14,8,13,9,11 };
  100. int FuseToPin16Mode3[] = { 2,19,3,18,4,17,5,16,6,15,7,14,8,13,9,12 };
  101.  
  102. int FuseToPin20Mode1[] = { 2,1,3,23,4,22,5,21,6,20,7,17,8,16,9,15,10,14,11,13 };
  103. int FuseToPin20Mode2[] = { 2,1,3,23,4,21,5,20,6,19,7,18,8,17,9,16,10,14,11,13 };
  104. int FuseToPin20Mode3[] = { 2,23,3,22,4,21,5,20,6,19,7,18,8,17,9,16,10,15,11,14 };
  105.  
  106. int FuseToPin22V10[]   = { 1,23,2,22,3,21,4,20,5,19,6,18,7,17,8,16,9,15,10,14,11,13 };
  107.  
  108. int FuseToPin20RA10[]  = { 2,23,3,22,4,21,5,20,6,19,7,18,8,17,9,16,10,15,11,14 };
  109.  
  110.  
  111.                     /* this vector shows which OLMC is */
  112.                     /* connected to which row */
  113. int OLMCToRow22V10[]   = { 1, 10, 21, 34, 49, 66, 83, 98, 111, 122 };
  114.  
  115.  
  116.  
  117.                 /* gadgets for GAL16V8 */
  118.  
  119. UWORD RAsm16GTypes[] = {
  120.     STRING_KIND,
  121.     STRING_KIND,
  122.     STRING_KIND,
  123.     STRING_KIND,
  124.     STRING_KIND,
  125.     STRING_KIND,
  126.     STRING_KIND,
  127.     STRING_KIND,
  128.     STRING_KIND,
  129.     STRING_KIND,
  130.     STRING_KIND,
  131.     STRING_KIND,
  132.     STRING_KIND,
  133.     STRING_KIND,
  134.     STRING_KIND,
  135.     STRING_KIND,
  136.     STRING_KIND,
  137.     STRING_KIND,
  138.     STRING_KIND,
  139.     STRING_KIND,
  140.     BUTTON_KIND,
  141.     BUTTON_KIND,
  142.     BUTTON_KIND,
  143.     BUTTON_KIND
  144. };
  145.  
  146. struct NewGadget RAsm16NGad[] = {
  147.     16, 11, 93, 12, (UBYTE *)" 1", NULL, GD_RAsmGad01, PLACETEXT_RIGHT, NULL, NULL,
  148.     16, 23, 93, 12, (UBYTE *)" 2", NULL, GD_RAsmGad02, PLACETEXT_RIGHT, NULL, NULL,
  149.     16, 35, 93, 12, (UBYTE *)" 3", NULL, GD_RAsmGad03, PLACETEXT_RIGHT, NULL, NULL,
  150.     16, 47, 93, 12, (UBYTE *)" 4", NULL, GD_RAsmGad04, PLACETEXT_RIGHT, NULL, NULL,
  151.     16, 59, 93, 12, (UBYTE *)" 5", NULL, GD_RAsmGad05, PLACETEXT_RIGHT, NULL, NULL,
  152.     16, 71, 93, 12, (UBYTE *)" 6", NULL, GD_RAsmGad06, PLACETEXT_RIGHT, NULL, NULL,
  153.     16, 83, 93, 12, (UBYTE *)" 7", NULL, GD_RAsmGad07, PLACETEXT_RIGHT, NULL, NULL,
  154.     16, 95, 93, 12, (UBYTE *)" 8", NULL, GD_RAsmGad08, PLACETEXT_RIGHT, NULL, NULL,
  155.     16, 107, 93, 12, (UBYTE *)" 9", NULL, GD_RAsmGad09, PLACETEXT_RIGHT, NULL, NULL,
  156.     15, 119, 93, 12, (UBYTE *)"10", NULL, GD_RAsmGad10, PLACETEXT_RIGHT, NULL, NULL,
  157.     179, 119, 93, 12, (UBYTE *)"11", NULL, GD_RAsmGad11, PLACETEXT_LEFT, NULL, NULL,
  158.     179, 107, 93, 12, (UBYTE *)"12", NULL, GD_RAsmGad12, PLACETEXT_LEFT, NULL, NULL,
  159.     179, 95, 93, 12, (UBYTE *)"13", NULL, GD_RAsmGad13, PLACETEXT_LEFT, NULL, NULL,
  160.     179, 83, 93, 12, (UBYTE *)"14", NULL, GD_RAsmGad14, PLACETEXT_LEFT, NULL, NULL,
  161.     179, 71, 93, 12, (UBYTE *)"15", NULL, GD_RAsmGad15, PLACETEXT_LEFT, NULL, NULL,
  162.     179, 59, 93, 12, (UBYTE *)"16", NULL, GD_RAsmGad16, PLACETEXT_LEFT, NULL, NULL,
  163.     179, 47, 93, 12, (UBYTE *)"17", NULL, GD_RAsmGad17, PLACETEXT_LEFT, NULL, NULL,
  164.     179, 35, 93, 12, (UBYTE *)"18", NULL, GD_RAsmGad18, PLACETEXT_LEFT, NULL, NULL,
  165.     179, 23, 93, 12, (UBYTE *)"19", NULL, GD_RAsmGad19, PLACETEXT_LEFT, NULL, NULL,
  166.     179, 11, 93, 12, (UBYTE *)"20", NULL, GD_RAsmGad20, PLACETEXT_LEFT, NULL, NULL,
  167.     193, 155, 79, 14, NULL, NULL, GD_RAsmGad30, PLACETEXT_IN, NULL, NULL,
  168.     16,  155, 79, 14, NULL, NULL, GD_RAsmGad31, PLACETEXT_IN, NULL, NULL,
  169.     117, 149, 54, 12, NULL, NULL, GD_RAsmGad32, PLACETEXT_IN, NULL, NULL,
  170.     117, 163, 54, 12, NULL, NULL, GD_RAsmGad33, PLACETEXT_IN, NULL, NULL
  171. };
  172.  
  173. ULONG RAsm16GTags[] = {
  174.     (GTST_String), (ULONG)"P1", (GTST_MaxChars), 9, (STRINGA_Justification), (GACT_STRINGRIGHT), (TAG_DONE),
  175.     (GTST_String), (ULONG)"P2", (GTST_MaxChars), 9, (STRINGA_Justification), (GACT_STRINGRIGHT), (TAG_DONE),
  176.     (GTST_String), (ULONG)"P3", (GTST_MaxChars), 9, (STRINGA_Justification), (GACT_STRINGRIGHT), (TAG_DONE),
  177.     (GTST_String), (ULONG)"P4", (GTST_MaxChars), 9, (STRINGA_Justification), (GACT_STRINGRIGHT), (TAG_DONE),
  178.     (GTST_String), (ULONG)"P5", (GTST_MaxChars), 9, (STRINGA_Justification), (GACT_STRINGRIGHT), (TAG_DONE),
  179.     (GTST_String), (ULONG)"P6", (GTST_MaxChars), 9, (STRINGA_Justification), (GACT_STRINGRIGHT), (TAG_DONE),
  180.     (GTST_String), (ULONG)"P7", (GTST_MaxChars), 9, (STRINGA_Justification), (GACT_STRINGRIGHT), (TAG_DONE),
  181.     (GTST_String), (ULONG)"P8", (GTST_MaxChars), 9, (STRINGA_Justification), (GACT_STRINGRIGHT), (TAG_DONE),
  182.     (GTST_String), (ULONG)"P9", (GTST_MaxChars), 9, (STRINGA_Justification), (GACT_STRINGRIGHT), (TAG_DONE),
  183.     (GTST_String), (ULONG)"GND", (GTST_MaxChars), 9, (STRINGA_Justification), (GACT_STRINGRIGHT), (TAG_DONE),
  184.     (GTST_String), (ULONG)"P11", (GTST_MaxChars), 9, (STRINGA_Justification), (GACT_STRINGLEFT), (TAG_DONE),
  185.     (GTST_String), (ULONG)"P12", (GTST_MaxChars), 9, (STRINGA_Justification), (GACT_STRINGLEFT), (TAG_DONE),
  186.     (GTST_String), (ULONG)"P13", (GTST_MaxChars), 9, (STRINGA_Justification), (GACT_STRINGLEFT), (TAG_DONE),
  187.     (GTST_String), (ULONG)"P14", (GTST_MaxChars), 9, (STRINGA_Justification), (GACT_STRINGLEFT), (TAG_DONE),
  188.     (GTST_String), (ULONG)"P15", (GTST_MaxChars), 9, (STRINGA_Justification), (GACT_STRINGLEFT), (TAG_DONE),
  189.     (GTST_String), (ULONG)"P16", (GTST_MaxChars), 9, (STRINGA_Justification), (GACT_STRINGLEFT), (TAG_DONE),
  190.     (GTST_String), (ULONG)"P17", (GTST_MaxChars), 9, (STRINGA_Justification), (GACT_STRINGLEFT), (TAG_DONE),
  191.     (GTST_String), (ULONG)"P18", (GTST_MaxChars), 9, (STRINGA_Justification), (GACT_STRINGLEFT), (TAG_DONE),
  192.     (GTST_String), (ULONG)"P19", (GTST_MaxChars), 9, (STRINGA_Justification), (GACT_STRINGLEFT), (TAG_DONE),
  193.     (GTST_String), (ULONG)"VCC", (GTST_MaxChars), 9, (STRINGA_Justification), (GACT_STRINGLEFT), (TAG_DONE),
  194.     (TAG_DONE),
  195.     (TAG_DONE),
  196.     (TAG_DONE),
  197.     (TAG_DONE)
  198. };
  199.  
  200.  
  201.  
  202.  
  203.             /* gadgets for GAL20V8,22V10,20RA10 */
  204.  
  205.  
  206. UWORD RAsm20GTypes[] = {
  207.     STRING_KIND,
  208.     STRING_KIND,
  209.     STRING_KIND,
  210.     STRING_KIND,
  211.     STRING_KIND,
  212.     STRING_KIND,
  213.     STRING_KIND,
  214.     STRING_KIND,
  215.     STRING_KIND,
  216.     STRING_KIND,
  217.     STRING_KIND,
  218.     STRING_KIND,
  219.     STRING_KIND,
  220.     STRING_KIND,
  221.     STRING_KIND,
  222.     STRING_KIND,
  223.     STRING_KIND,
  224.     STRING_KIND,
  225.     STRING_KIND,
  226.     STRING_KIND,
  227.     STRING_KIND,
  228.     STRING_KIND,
  229.     STRING_KIND,
  230.     STRING_KIND,
  231.     BUTTON_KIND,
  232.     BUTTON_KIND,
  233.     BUTTON_KIND,
  234.     BUTTON_KIND
  235. };
  236.  
  237. struct NewGadget RAsm20NGad[] = {
  238.     16, 1, 93, 12, (UBYTE *)" 1", NULL, GD_RAsmGad01, PLACETEXT_RIGHT, NULL, NULL,
  239.     16, 13, 93, 12, (UBYTE *)" 2", NULL, GD_RAsmGad02, PLACETEXT_RIGHT, NULL, NULL,
  240.     16, 25, 93, 12, (UBYTE *)" 3", NULL, GD_RAsmGad03, PLACETEXT_RIGHT, NULL, NULL,
  241.     16, 37, 93, 12, (UBYTE *)" 4", NULL, GD_RAsmGad04, PLACETEXT_RIGHT, NULL, NULL,
  242.     16, 49, 93, 12, (UBYTE *)" 5", NULL, GD_RAsmGad05, PLACETEXT_RIGHT, NULL, NULL,
  243.     16, 61, 93, 12, (UBYTE *)" 6", NULL, GD_RAsmGad06, PLACETEXT_RIGHT, NULL, NULL,
  244.     16, 73, 93, 12, (UBYTE *)" 7", NULL, GD_RAsmGad07, PLACETEXT_RIGHT, NULL, NULL,
  245.     16, 85, 93, 12, (UBYTE *)" 8", NULL, GD_RAsmGad08, PLACETEXT_RIGHT, NULL, NULL,
  246.     16, 97, 93, 12, (UBYTE *)" 9", NULL, GD_RAsmGad09, PLACETEXT_RIGHT, NULL, NULL,
  247.     16, 109, 93, 12, (UBYTE *)"10", NULL, GD_RAsmGad10, PLACETEXT_RIGHT, NULL, NULL,
  248.     16, 121, 93, 12, (UBYTE *)"11", NULL, GD_RAsmGad11, PLACETEXT_RIGHT, NULL, NULL,
  249.     16, 133, 93, 12, (UBYTE *)"12", NULL, GD_RAsmGad12, PLACETEXT_RIGHT, NULL, NULL,
  250.     179, 133, 93, 12, (UBYTE *)"13", NULL, GD_RAsmGad13, PLACETEXT_LEFT, NULL, NULL,
  251.     179, 121, 93, 12, (UBYTE *)"14", NULL, GD_RAsmGad14, PLACETEXT_LEFT, NULL, NULL,
  252.     179, 109, 93, 12, (UBYTE *)"15", NULL, GD_RAsmGad15, PLACETEXT_LEFT, NULL, NULL,
  253.     179, 97, 93, 12, (UBYTE *)"16", NULL, GD_RAsmGad16, PLACETEXT_LEFT, NULL, NULL,
  254.     179, 85, 93, 12, (UBYTE *)"17", NULL, GD_RAsmGad17, PLACETEXT_LEFT, NULL, NULL,
  255.     179, 73, 93, 12, (UBYTE *)"18", NULL, GD_RAsmGad18, PLACETEXT_LEFT, NULL, NULL,
  256.     179, 61, 93, 12, (UBYTE *)"19", NULL, GD_RAsmGad19, PLACETEXT_LEFT, NULL, NULL,
  257.     179, 49, 93, 12, (UBYTE *)"20", NULL, GD_RAsmGad20, PLACETEXT_LEFT, NULL, NULL,
  258.     179, 37, 93, 12, (UBYTE *)"21", NULL, GD_RAsmGad21, PLACETEXT_LEFT, NULL, NULL,
  259.     179, 25, 93, 12, (UBYTE *)"22", NULL, GD_RAsmGad22, PLACETEXT_LEFT, NULL, NULL,
  260.     179, 13, 93, 12, (UBYTE *)"23", NULL, GD_RAsmGad23, PLACETEXT_LEFT, NULL, NULL,
  261.     179, 1, 93, 12, (UBYTE *)"24", NULL, GD_RAsmGad24, PLACETEXT_LEFT, NULL, NULL,
  262.     193, 155, 79, 14, NULL, NULL, GD_RAsmGad30, PLACETEXT_IN, NULL, NULL,
  263.     16,  155, 79, 14, NULL, NULL, GD_RAsmGad31, PLACETEXT_IN, NULL, NULL,
  264.     117, 149, 54, 12, NULL, NULL, GD_RAsmGad32, PLACETEXT_IN, NULL, NULL,
  265.     117, 163, 54, 12, NULL, NULL, GD_RAsmGad33, PLACETEXT_IN, NULL, NULL
  266. };
  267.  
  268. ULONG RAsm20GTags[] = {
  269.     (GTST_String), (ULONG)"P1", (GTST_MaxChars), 9, (STRINGA_Justification), (GACT_STRINGRIGHT), (TAG_DONE),
  270.     (GTST_String), (ULONG)"P2", (GTST_MaxChars), 9, (STRINGA_Justification), (GACT_STRINGRIGHT), (TAG_DONE),
  271.     (GTST_String), (ULONG)"P3", (GTST_MaxChars), 9, (STRINGA_Justification), (GACT_STRINGRIGHT), (TAG_DONE),
  272.     (GTST_String), (ULONG)"P4", (GTST_MaxChars), 9, (STRINGA_Justification), (GACT_STRINGRIGHT), (TAG_DONE),
  273.     (GTST_String), (ULONG)"P5", (GTST_MaxChars), 9, (STRINGA_Justification), (GACT_STRINGRIGHT), (TAG_DONE),
  274.     (GTST_String), (ULONG)"P6", (GTST_MaxChars), 9, (STRINGA_Justification), (GACT_STRINGRIGHT), (TAG_DONE),
  275.     (GTST_String), (ULONG)"P7", (GTST_MaxChars), 9, (STRINGA_Justification), (GACT_STRINGRIGHT), (TAG_DONE),
  276.     (GTST_String), (ULONG)"P8", (GTST_MaxChars), 9, (STRINGA_Justification), (GACT_STRINGRIGHT), (TAG_DONE),
  277.     (GTST_String), (ULONG)"P9", (GTST_MaxChars), 9, (STRINGA_Justification), (GACT_STRINGRIGHT), (TAG_DONE),
  278.     (GTST_String), (ULONG)"P10", (GTST_MaxChars), 9, (STRINGA_Justification), (GACT_STRINGRIGHT), (TAG_DONE),
  279.     (GTST_String), (ULONG)"P11", (GTST_MaxChars), 9, (STRINGA_Justification), (GACT_STRINGRIGHT), (TAG_DONE),
  280.     (GTST_String), (ULONG)"GND", (GTST_MaxChars), 9, (STRINGA_Justification), (GACT_STRINGRIGHT), (TAG_DONE),
  281.     (GTST_String), (ULONG)"P13", (GTST_MaxChars), 9, (STRINGA_Justification), (GACT_STRINGLEFT), (TAG_DONE),
  282.     (GTST_String), (ULONG)"P14", (GTST_MaxChars), 9, (STRINGA_Justification), (GACT_STRINGLEFT), (TAG_DONE),
  283.     (GTST_String), (ULONG)"P15", (GTST_MaxChars), 9, (STRINGA_Justification), (GACT_STRINGLEFT), (TAG_DONE),
  284.     (GTST_String), (ULONG)"P16", (GTST_MaxChars), 9, (STRINGA_Justification), (GACT_STRINGLEFT), (TAG_DONE),
  285.     (GTST_String), (ULONG)"P17", (GTST_MaxChars), 9, (STRINGA_Justification), (GACT_STRINGLEFT), (TAG_DONE),
  286.     (GTST_String), (ULONG)"P18", (GTST_MaxChars), 9, (STRINGA_Justification), (GACT_STRINGLEFT), (TAG_DONE),
  287.     (GTST_String), (ULONG)"P19", (GTST_MaxChars), 9, (STRINGA_Justification), (GACT_STRINGLEFT), (TAG_DONE),
  288.     (GTST_String), (ULONG)"P20", (GTST_MaxChars), 9, (STRINGA_Justification), (GACT_STRINGLEFT), (TAG_DONE),
  289.     (GTST_String), (ULONG)"P21", (GTST_MaxChars), 9, (STRINGA_Justification), (GACT_STRINGLEFT), (TAG_DONE),
  290.     (GTST_String), (ULONG)"P22", (GTST_MaxChars), 9, (STRINGA_Justification), (GACT_STRINGLEFT), (TAG_DONE),
  291.     (GTST_String), (ULONG)"P23", (GTST_MaxChars), 9, (STRINGA_Justification), (GACT_STRINGLEFT), (TAG_DONE),
  292.     (GTST_String), (ULONG)"VCC", (GTST_MaxChars), 9, (STRINGA_Justification), (GACT_STRINGLEFT), (TAG_DONE),
  293.     (TAG_DONE),
  294.     (TAG_DONE),
  295.     (TAG_DONE),
  296.     (TAG_DONE)
  297. };
  298.  
  299.  
  300.  
  301. /***************************** routines  ********************************/
  302.  
  303.  
  304.  
  305. /* this routine returns the pointer to the String-Gadget-text of the
  306. ** pin 'pinnum'
  307. */
  308. UBYTE *PinNamePtr(int pinnum, struct Gadget *gadget)
  309. {
  310.  
  311.  while (gadget) {
  312.  
  313.    if (gadget->GadgetID == pinnum)
  314.      return (((struct StringInfo *)gadget->SpecialInfo)->Buffer);
  315.  
  316.    gadget = gadget->NextGadget;
  317.  
  318.  }
  319.  
  320.  return((UBYTE *)0);
  321. }
  322.  
  323.  
  324.  
  325.  
  326.  
  327. /* CheckPinNames: checks 'syntax' pinnames
  328.    Call:    result = CheckPinNames();
  329.         JedecGALType must be the type of GAL
  330.    Result:  result = 0: o.k.
  331.                <>0: error number
  332. */
  333. int CheckPinNames(void)
  334. {
  335. struct    Gadget    *glist;
  336. UBYTE    *ptr;
  337. int    numofpins, i, j, l, n;
  338.  
  339.  
  340.   if (JedecGALType == GAL16V8) {
  341.     numofpins = 20;
  342.     glist = RAsm16GList;
  343.   }
  344.   else {
  345.     numofpins = 24;
  346.     glist = RAsm20GList;
  347.   }
  348.  
  349.                     /*** check the pin names ***/
  350.   for (n = 0; n < numofpins; n++) {
  351.  
  352.     ptr = PinNamePtr(n+1, glist);        /*are all characters of the*/
  353.                         /*pin name allowed? */
  354.     if (*ptr == '/')
  355.       ptr++;
  356.  
  357.     if (!*ptr) {                /*no characters? => error*/
  358.       ReasmError(4, n+1);
  359.       return(4);
  360.     }
  361.  
  362.     while (isalpha(*ptr) || isdigit(*ptr))
  363.       ptr++;
  364.  
  365.     if (*ptr == '/') {
  366.       ReasmError(6, n+1);
  367.       return(6);
  368.     }
  369.  
  370.     if (*ptr) {
  371.       ReasmError(3, n+1);
  372.       return(3);
  373.     }
  374.  
  375.     for (l=0; l<n; l++) {            /*pin name twice?*/
  376.       if (strcmp((char *)PinNamePtr(l+1, glist), "NC")) {
  377.         i = j = 0;
  378.  
  379.         if (*(PinNamePtr(l+1, glist)) == '/') i = 1;
  380.  
  381.         if (*(PinNamePtr(n+1, glist)) == '/') j = 1;
  382.  
  383.         if (!strcmp((char *)PinNamePtr(l+1, glist) + (long)i, (char *)PinNamePtr(n+1, glist) + (long)j)) {
  384.       ReasmError(2, n+1);
  385.       return(2);
  386.         }
  387.       }
  388.     }
  389.                     /*GND as pin name at GAL's GND pin?*/
  390.     if (!strcmp((char *)PinNamePtr(n+1, glist), "GND")) {
  391.       if (n+1 != numofpins/2) {
  392.         ReasmError(5, n+1);
  393.         return(5);
  394.       }
  395.     }
  396.  
  397.     if (n+1 == numofpins/2) {
  398.       if (strcmp((char *)PinNamePtr(n+1, glist), "GND")) {
  399.         ReasmError(7, n+1);
  400.         return(7);
  401.       }
  402.     }
  403.                     /*VCC as pin name at GAL's VCC pin?*/
  404.     if (!strcmp((char *)PinNamePtr(n+1, glist), "VCC")) {
  405.       if (n+1 != numofpins) {
  406.         ReasmError(5, n+1);
  407.         return(5);
  408.       }
  409.     }
  410.  
  411.     if (n+1 == numofpins) {
  412.       if (strcmp((char *)PinNamePtr(n+1, glist), "VCC")) {
  413.         ReasmError(8, n+1);
  414.         return(8);
  415.       }
  416.      }
  417.                     /* AR and SP are key words for 22V10 */
  418.                     /* they are not allowed in the pin */
  419.                     /* declaration */
  420.     if (JedecGALType == GAL22V10) {
  421.       if (!strcmp((char *)PinNamePtr(n+1, glist), "AR")) {
  422.         ReasmError(9, n+1);
  423.         return(9);
  424.       }
  425.  
  426.       if (!strcmp((char *)PinNamePtr(n+1, glist), "SP")) {
  427.         ReasmError(10, n+1);
  428.         return(10);
  429.       }
  430.     }
  431.  
  432.  
  433.   }
  434.  
  435.   return(0);
  436. }
  437.  
  438.  
  439.  
  440.  
  441. /* PinNameRequester: brings up requester in which you can edit the names
  442.             of the pins
  443.    Call     : result = PinNameRequester(galtype);
  444.    Parameter: galtype: type of GAL
  445.    Result   : result = 0: Continue selected
  446.              = 1: Cancel selected or error
  447. */
  448. int PinNameRequester(int galtype)
  449. {
  450. struct    Window             *reasmwin;
  451. struct    IntuiMessage    *imsg;
  452. struct    Gadget        *glist, *gadget;
  453. ULONG    class;
  454. USHORT    code, gadID;
  455. UWORD   offy = screen->WBorTop + screen->RastPort.TxHeight + 1;
  456. int    n, numofpins;
  457. char    name[4], numstrng[3];
  458.  
  459.   if (galtype == GAL16V8) {        /* initialize variables */
  460.     numofpins = 20;
  461.     glist     = RAsm16GList;
  462.   }
  463.   else {
  464.     numofpins = 24;
  465.     glist     = RAsm20GList;
  466.   }
  467.  
  468.                     /* open window */
  469.   if (!(reasmwin = OpenWindowTags( NULL,
  470.             WA_Left,     171,
  471.             WA_Top,         5,
  472.             WA_Width,     297,
  473.             WA_Height,     180 + offy,
  474.             WA_IDCMP,     STRINGIDCMP|BUTTONIDCMP|IDCMP_REFRESHWINDOW|IDCMP_VANILLAKEY,
  475.             WA_Flags,     WFLG_DRAGBAR|WFLG_DEPTHGADGET|WFLG_SMART_REFRESH|WFLG_ACTIVATE,
  476.             WA_Gadgets,     glist,
  477.             WA_Title,     (UBYTE *)"Reassembler",
  478.             WA_CustomScreen, screen,
  479.             TAG_DONE )))
  480.     return(1);
  481.  
  482.  
  483.   GT_RefreshWindow(reasmwin, NULL);
  484.  
  485.  
  486.  
  487.  
  488.   for (;;) {
  489.  
  490.     Wait (1 << reasmwin->UserPort->mp_SigBit);
  491.  
  492.     while (imsg = GT_GetIMsg(reasmwin->UserPort)) {
  493.  
  494.       class = imsg->Class;
  495.       code  = imsg->Code;
  496.  
  497.       if (class == GADGETUP)
  498.     gadID = ((struct Gadget *)imsg->IAddress)->GadgetID;
  499.  
  500.       GT_ReplyIMsg(imsg);
  501.  
  502.  
  503.       if (class == VANILLAKEY) {
  504.     if (code == 13) {            /* Return-key => Continue */
  505.       if (!CheckPinNames()) {
  506.         CloseWindow(reasmwin);
  507.         return(0);
  508.       }
  509.     }
  510.  
  511.     if (code == 0x1B) {            /* ESC-key => Cancel */
  512.       CloseWindow(reasmwin);
  513.       return(1);
  514.         }
  515.       }
  516.  
  517.       if (class == GADGETUP) {
  518.  
  519.     switch (gadID) {
  520.  
  521.       case GD_RAsmGad30:                /* Cancel */
  522.         CloseWindow(reasmwin);
  523.         return(1);
  524.  
  525.       case GD_RAsmGad31:                /* Continue */
  526.         if (!CheckPinNames()) {
  527.           CloseWindow(reasmwin);
  528.           return(0);
  529.         }
  530.         break;
  531.  
  532.       case GD_RAsmGad32:                /* Clear */
  533.         gadget = glist;            /* reset name of pins */
  534.  
  535.         while (gadget) {
  536.           if ((gadget->GadgetID < numofpins) &&
  537.               (gadget->GadgetID != numofpins/2))
  538.             GT_SetGadgetAttrs(gadget, reasmwin, NULL, GTST_String, NULL, TAG_END);
  539.  
  540.           gadget = gadget->NextGadget;
  541.         }
  542.         break;
  543.  
  544.       case GD_RAsmGad33:                /* Set */
  545.         gadget = glist;
  546.  
  547.         while (gadget) {
  548.           n = (int)gadget->GadgetID;
  549.  
  550.           if (n <= numofpins) {
  551.             if (n == numofpins/2)
  552.               GT_SetGadgetAttrs(gadget, reasmwin, NULL, GTST_String, "GND", TAG_END);
  553.             else
  554.               if (n == numofpins)
  555.                 GT_SetGadgetAttrs(gadget, reasmwin, NULL, GTST_String, "VCC", TAG_END);
  556.               else {
  557.             name[0] = 'P';
  558.             name[1] = (char)0;
  559.  
  560.             sprintf(numstrng, "%d", n);
  561.  
  562.             strcat(name, numstrng);
  563.  
  564.                 GT_SetGadgetAttrs(gadget, reasmwin, NULL, GTST_String, name, TAG_END);
  565.               }
  566.           }
  567.  
  568.           gadget = gadget->NextGadget;
  569.         }
  570.         break;
  571.  
  572.     }
  573.       }
  574.     }
  575.   }
  576.  
  577.   return(1);
  578. }
  579.  
  580.  
  581.  
  582.  
  583. /*RowActive: tests whether a row of the logic array is active or not
  584.          checks PT-bit (16V8, 20V8 and searchs for the
  585.          expression A * /A
  586.   Call:   result = RowActive(row, galtype);
  587.   Para.:    row: row which should be tested
  588.         galtype: type of GAL
  589.   Result: result = 0: row is not active
  590.          = 1: row is active
  591.          = 2: row is active but includes only '1' (means VCC)
  592. */
  593. int RowActive(int row, int galtype)
  594. {
  595. int n, colsize, flag;
  596.  
  597.  
  598.   switch (galtype) {                /* get number of columns */
  599.     case GAL16V8:
  600.       colsize = MAX_FUSE_ADR16 + 1;
  601.       break;
  602.  
  603.     case GAL20V8:
  604.       colsize = MAX_FUSE_ADR20 + 1;
  605.       break;
  606.  
  607.     case GAL22V10:
  608.       colsize = MAX_FUSE_ADR22V10 + 1;
  609.       break;
  610.  
  611.     case GAL20RA10:
  612.       colsize = MAX_FUSE_ADR20RA10 + 1;
  613.       break;
  614.   }
  615.  
  616.  
  617.   if (galtype == GAL16V8 || galtype == GAL20V8)
  618.     if (!Jedec.GALPT[row])            /* check PT-bit which */
  619.       return(0);                /* enables/disables a row */
  620.  
  621.   flag = 0;
  622.   for (n = 0; n < colsize; n++) {        /* search for "A * /A" */
  623.     if (!Jedec.GALLogic[row*colsize+n]) {
  624.       flag = 1;
  625.       if (!(n % 2))
  626.         if (!Jedec.GALLogic[row*colsize+n+1])
  627.           return(0);
  628.     }
  629.   }
  630.  
  631.   if (flag)
  632.     return(1);
  633.   else
  634.     return(2);
  635. }
  636.  
  637.  
  638.  
  639.  
  640.  
  641. /*OLMCOutput: checks whether a OLMC pin is programmed as output
  642.   Call:       result = OLMCOutput(olmc);
  643.             olmc:    OLMC which should be tested
  644.           mode:    mode of GAL (only when 16V8, 20V8)
  645.           JedecGALType: type of GAL
  646.   Result:     result = 0:  no output
  647.                 = 1:  output (there is a equation which describes
  648.                    this output pin)
  649. */
  650. int OLMCOutput(int olmc, int mode)
  651. {
  652. int n, flag;
  653.  
  654.  
  655.   flag = 0;
  656.  
  657.   if (JedecGALType == GAL16V8 || JedecGALType == GAL20V8) {
  658.     if ((mode == 1) && (Jedec.GALAC1[olmc]))
  659.       return(0);
  660.  
  661.     for (n = 0; n < 8; n++) {
  662.       if (!n && ((mode == 2) || ((mode == 3) && Jedec.GALAC1[olmc]))) {
  663.         if (!RowActive(olmc * 8, JedecGALType))    /*tristate enable = GND?*/
  664.           return(0);                /*yes, then input pin*/
  665.       }
  666.       else {
  667.         if (RowActive(olmc * 8 + n, JedecGALType))
  668.           flag = 1;
  669.       }
  670.     }
  671.   }
  672.  
  673.  
  674.   if (JedecGALType == GAL22V10)         /* pin is output when tristate */
  675.     if (RowActive(OLMCToRow22V10[olmc], JedecGALType)) /* can be HIGH/LOW */
  676.       return(1);
  677.  
  678.   if (JedecGALType == GAL20RA10)     /* pin is output when tristate */
  679.     if (RowActive(olmc * 8, JedecGALType))  /* can be HIGH/LOW */
  680.       return(1);
  681.  
  682.  
  683.   return(flag);
  684. }
  685.  
  686.  
  687.  
  688. /*MakeEquation: examines the rows of a OLMC and generates the equation
  689.   Call: result = MakeEquation(buff, olmc, colsize, mode, rowoffset, numofrows);
  690.  
  691.   Result:   result =  0: no errors
  692.               = -1: error (out of memory)
  693. */
  694. int MakeEquation(struct ActBuffer *buff, int olmc, int colsize, int mode,
  695.                  int rowoffset, int numofrows)
  696. {
  697. int    ORflag, ANDflag, pin, m, n, result, numofchar;
  698. int    offset, row, lastrow;
  699. struct    ActBuffer  startbuff;
  700.  
  701.  
  702.   startbuff = *buff;                /* save pointer*/
  703.  
  704.   numofchar = 8;
  705.   ORflag    = 0;
  706.  
  707.   n       = rowoffset;
  708.   lastrow = numofrows + rowoffset;
  709.  
  710.   while (n < lastrow) {
  711.  
  712.     if (JedecGALType == GAL22V10) {        /* 22V10 => different sizes */
  713.                         /* of OLMCs and additional  */
  714.       row = OLMCToRow22V10[olmc];        /* AS and RS rows           */
  715.  
  716.       if (mode == 4)
  717.     row = 0;                /* asynch. reset */
  718.       else
  719.     if (mode == 5)
  720.       row = 131;                /* synch. preset */
  721.     }
  722.     else
  723.       row = olmc * 8;                /* 16V8,20V8,20RA10: OLMC size */
  724.                            /* is constant (=8) */
  725.  
  726.     result = RowActive(row + n, JedecGALType);
  727.  
  728.  
  729.     if (result == 1) {                /* is row active? */
  730.  
  731.       if (ORflag) {                /* yes, then OR*/
  732.         if (AddString(buff, (UBYTE *)" + "))
  733.       return(-1);
  734.         numofchar += 3;                /* count characters */
  735.       }
  736.  
  737.       ORflag  = 1;
  738.       ANDflag = 0;
  739.  
  740.       for (m = 0; m < colsize; m++) {
  741.  
  742.     if (JedecGALType == GAL22V10) {        /* 22V10 => different sizes */
  743.                         /* of OLMCs and additional  */
  744.       offset = (OLMCToRow22V10[olmc] + n) * colsize;
  745.                         /* AS and RS rows           */
  746.       if (mode == 4)
  747.         offset = 0;                    /* asynch. reset */
  748.        else
  749.         if (mode == 5)
  750.           offset = 5764;                /* synch. preset */
  751.     }
  752.     else
  753.       offset = (olmc * 8 + n) * colsize;    /* 16V8,20V8,20RA10: OLMC size */
  754.                         /* is constant (=8) */
  755.  
  756.         if (!Jedec.GALLogic[offset + m]) {    /* fuse = 0? */
  757.  
  758.           if (ANDflag) {
  759.             if (AddByte(buff, (UBYTE)'*'))    /* evaluate product term */
  760.            return(-1);
  761.         numofchar++;
  762.           }
  763.  
  764.           ANDflag = 1;
  765.                     /*** GAL16V8 ***/
  766.  
  767.           if (JedecGALType == GAL16V8) {
  768.             if (mode == 1)            /* get pin number */
  769.           pin = FuseToPin16Mode1[m/2];
  770.  
  771.         if (mode == 2)
  772.          pin = FuseToPin16Mode2[m/2];
  773.  
  774.         if (mode == 3)
  775.           pin = FuseToPin16Mode3[m/2];
  776.                         /* was there a negation in */
  777.                         /* in the declaration? */
  778.         if (((*PinNamePtr(pin, RAsm16GList) == '/') && !(m % 2)) ||
  779.             ((*PinNamePtr(pin, RAsm16GList) != '/') &&  (m % 2))) {
  780.           if (AddByte(buff, (UBYTE)'/'))
  781.             return(-1);
  782.           numofchar++;
  783.         }
  784.                         /* write pin name without '/' */
  785.         if (*PinNamePtr(pin, RAsm16GList) == '/') {
  786.           if (AddString(buff, (PinNamePtr(pin, RAsm16GList) + 1L)))
  787.                 return(-1);
  788.         }
  789.         else {
  790.           if (AddString(buff, PinNamePtr(pin, RAsm16GList)))
  791.                 return(-1);
  792.         }
  793.  
  794.         numofchar += (int)strlen((char *)PinNamePtr(pin, RAsm16GList));
  795.           }
  796.       else {            /*** GAL20V8, 22V10, 20RA10 ***/
  797.  
  798.         if (JedecGALType == GAL20V8) {
  799.           if (mode == 1)                /* get pin number */
  800.         pin = FuseToPin20Mode1[m/2];
  801.  
  802.           if (mode == 2)
  803.         pin = FuseToPin20Mode2[m/2];
  804.  
  805.           if (mode == 3)
  806.         pin = FuseToPin20Mode3[m/2];
  807.         }
  808.  
  809.         if (JedecGALType == GAL22V10)
  810.           pin = FuseToPin22V10[m/2];
  811.  
  812.         if (JedecGALType == GAL20RA10)
  813.           pin = FuseToPin20RA10[m/2];
  814.                         /* was there a negation in */
  815.                         /* the pin declaration? */
  816.         if (((*PinNamePtr(pin, RAsm20GList) == '/') && !(m % 2)) ||
  817.             ((*PinNamePtr(pin, RAsm20GList) != '/') &&  (m % 2))) {
  818.           if (AddByte(buff, (UBYTE)'/'))
  819.             return(-1);
  820.           numofchar++;
  821.         }
  822.                         /* write pin name without '/' */
  823.         if (*PinNamePtr(pin, RAsm20GList) == '/') {
  824.           if (AddString(buff, PinNamePtr(pin, RAsm20GList) + 1L))
  825.                 return(-1);
  826.         }
  827.         else {
  828.           if (AddString(buff, PinNamePtr(pin, RAsm20GList)))
  829.                 return(-1);
  830.         }
  831.  
  832.         numofchar += (int)strlen((char *)PinNamePtr(pin, RAsm20GList));
  833.       }
  834.  
  835.  
  836.       if (numofchar > 60) {                /* new line? */
  837.         if (AddString(buff, (UBYTE *)"\n        "))
  838.           return(-1);
  839.         numofchar = 8;
  840.       }
  841.         }
  842.       }
  843.     }
  844.  
  845.     if (result == 2) {                /* only '1' in all rows? */
  846.       *buff = startbuff;            /* then VCC */
  847.       if (AddString(buff, (UBYTE *)"VCC"))
  848.         return(-1);
  849.         break;
  850.     }
  851.  
  852.     n++;
  853.   }
  854.  
  855.   if (AddString(buff, (UBYTE *)"\n\n"))        /* end of the equation */
  856.     return(-1);
  857.  
  858.   return(0);
  859. }
  860.  
  861.  
  862.  
  863.  
  864.  
  865.  
  866.  
  867. /*Reasm: reassemble a JEDEC file and generate the appropriate source file
  868.      the source file is stored in 'buff'
  869.   Call:  result = Reasm(buff);
  870.        buff: ActBuffer structure for buffer in which the source file
  871.            should be stored
  872.   Result: result = 0: no errors
  873.          <>0: error
  874. */
  875. int Reasm(struct ActBuffer buff)
  876. {
  877. int    mode, n, numofpins, byte, tricon;
  878. int    firstOLMC, olmc, colsize, numofOLMCs;
  879. UBYTE   *ptr;
  880.  
  881.                     /*** write type of GAL ***/
  882.   switch (JedecGALType) {
  883.     case GAL16V8:
  884.     if (AddString(&buff, (UBYTE *)"GAL16V8\n"))
  885.       return(-1);
  886.     numofpins  = 20;
  887.     numofOLMCs = 8;
  888.     colsize    = MAX_FUSE_ADR16 + 1;
  889.     break;
  890.        
  891.     case GAL20V8:
  892.     if (AddString(&buff, (UBYTE *)"GAL20V8\n"))
  893.       return(-1);
  894.     numofpins  = 24;
  895.     numofOLMCs = 8;
  896.     firstOLMC  = 22;
  897.     colsize    = MAX_FUSE_ADR20 + 1;
  898.     break;
  899.  
  900.     case GAL22V10:
  901.     if (AddString(&buff, (UBYTE *)"GAL22V10\n"))
  902.       return(-1);
  903.     numofpins  = 24;
  904.     numofOLMCs = 10;
  905.     firstOLMC  = 23;
  906.     colsize    = MAX_FUSE_ADR22V10 + 1;
  907.     break;
  908.  
  909.     case GAL20RA10:
  910.     if (AddString(&buff, (UBYTE *)"GAL20RA10\n"))
  911.       return(-1);
  912.     numofpins  = 24;
  913.     numofOLMCs = 10;
  914.     firstOLMC  = 23;
  915.     colsize    = MAX_FUSE_ADR20RA10 + 1;
  916.     break;
  917.   }
  918.  
  919.  
  920.  
  921.   byte = 0;                /*** write signature ***/
  922.   for (n = 0; n < SIG_SIZE; n++) {
  923.     byte |= Jedec.GALSig[n];            /* put 8 bits to one byte */
  924.  
  925.     if (!((n+1)%8)) {                /* together */
  926.       if (!isprint(byte))
  927.         byte = '.';
  928.  
  929.       if (AddByte(&buff, (UBYTE)byte))
  930.         return(-1);
  931.  
  932.       byte = 0;
  933.     }
  934.  
  935.     byte <<= 1;
  936.   } 
  937.  
  938.   if (AddString(&buff, (UBYTE *)"\n\n"))    /* new lines */
  939.     return(-1);
  940.  
  941.  
  942.                     /*** write pin declaration ***/
  943.   for (n = 1; n <= numofpins; n++) {
  944.     if (JedecGALType == GAL16V8) {
  945.       if (AddString(&buff, PinNamePtr(n, RAsm16GList)))
  946.     return(-1);
  947.     }
  948.     else
  949.       if (AddString(&buff, PinNamePtr(n, RAsm20GList)))
  950.     return(-1);
  951.  
  952.     if (n == numofpins/2) {
  953.       if (AddString(&buff, (UBYTE *)"\n"))
  954.     return(-1);
  955.     }
  956.     else {
  957.       if (AddString(&buff, (UBYTE *)" "))
  958.     return(-1);
  959.     }
  960.   }
  961.  
  962.   if (AddString(&buff, (UBYTE *)"\n\n"))
  963.     return(-1);
  964.  
  965.  
  966.   mode = 0;
  967.  
  968.   if (JedecGALType == GAL16V8 || JedecGALType == GAL20V8) {
  969.  
  970.     if (!Jedec.GALAC0 && !Jedec.GALSYN) {    /* check mode of GAL */
  971.       ReasmError(1, 0);                /* error? then return */
  972.       return(1);
  973.     }
  974.                         /* get mode of GAL */
  975.     if (!Jedec.GALSYN) {            /* if SYN = 0 then mode 3 */
  976.       mode = 3;                    /* (register) */
  977.     }
  978.     else {
  979.       if (Jedec.GALSYN && Jedec.GALAC0)
  980.         mode = 2;                /* tristate mode */
  981.       else
  982.          mode = 1;                /* combinational mode */
  983.     }
  984.   }
  985.  
  986.                     /*** generate the equations ***/
  987.  
  988.   for (olmc = 0; olmc < numofOLMCs; olmc++) {    /* all OLMCs */
  989.  
  990.     tricon = 0;
  991.  
  992.     if (OLMCOutput(olmc, mode)) {        /* is OLMC a output? */
  993.  
  994.       if (JedecGALType == GAL16V8) {        /* is there a negation in */
  995.                         /* the pin declaration */
  996.         if (((*PinNamePtr(19 - olmc, RAsm16GList) == '/') && Jedec.GALXOR[olmc]) ||
  997.         ((*PinNamePtr(19 - olmc, RAsm16GList) != '/') && !Jedec.GALXOR[olmc])) {
  998.       if (AddByte(&buff, (UBYTE)'/'))
  999.         return(-1);
  1000.         }
  1001.  
  1002.                         /* write pin name without '/' */
  1003.         if (*PinNamePtr(19 - olmc, RAsm16GList) == '/') {
  1004.       if (AddString(&buff, ptr = PinNamePtr(19 - olmc, RAsm16GList) + 1L))
  1005.             return(-1);
  1006.         }
  1007.         else {
  1008.       if (AddString(&buff, ptr = PinNamePtr(19 - olmc, RAsm16GList)))
  1009.             return(-1);
  1010.         }
  1011.       }
  1012.       else {
  1013.                         /* write pin name without '/' */
  1014.         if (((*PinNamePtr(firstOLMC-olmc, RAsm20GList) == '/') && Jedec.GALXOR[olmc]) ||
  1015.         ((*PinNamePtr(firstOLMC-olmc, RAsm20GList) != '/') && !Jedec.GALXOR[olmc])) {
  1016.       if (AddByte(&buff, (UBYTE)'/'))
  1017.         return(-1);
  1018.         }
  1019.                         /* write pin name without '/' */
  1020.         if (*PinNamePtr(firstOLMC - olmc, RAsm20GList) == '/') {
  1021.       if (AddString(&buff, ptr = PinNamePtr(firstOLMC - olmc, RAsm20GList) + 1L))
  1022.             return(-1);
  1023.         }
  1024.         else {
  1025.       if (AddString(&buff, ptr = PinNamePtr(firstOLMC - olmc, RAsm20GList)))
  1026.             return(-1);
  1027.         }
  1028.       }
  1029.                     /*** get type of output ***/
  1030.  
  1031.       if (JedecGALType == GAL16V8 || JedecGALType == GAL20V8) {
  1032.  
  1033.         if ((mode == 2) || ((mode == 3) && (Jedec.GALAC1[olmc]))) {
  1034.           if (AddString(&buff, (UBYTE *)".T"))
  1035.             return(-1);
  1036.           tricon = 1;                /* there is a tristate output, */
  1037.         }                    /* so set tricon flag */
  1038.  
  1039.         if ((mode == 3) && (!Jedec.GALAC1[olmc]))
  1040.           if (AddString(&buff, (UBYTE *)".R"))
  1041.             return(-1);
  1042.  
  1043.         if (AddString(&buff, (UBYTE *)" = "))
  1044.           return(-1);
  1045.  
  1046.         n = 0;                    /* if there is a tristate control */
  1047.         if ((mode == 2) || ((mode == 3) && Jedec.GALAC1[olmc]))
  1048.           n++;                    /* skip first row of OLMC */
  1049.  
  1050.         if (MakeEquation(&buff, olmc, colsize, mode, n, 8))
  1051.           return(-1);
  1052.  
  1053.                         /* write equation of */
  1054.     if (tricon) {                /* tristate control  */
  1055.  
  1056.       if (AddString(&buff, ptr))            /* write pin name */
  1057.         return(-1);
  1058.  
  1059.       if (AddString(&buff, (UBYTE *)".E = "))    /* tristate enable */
  1060.         return(-1);
  1061.  
  1062.       if (MakeEquation(&buff, olmc, colsize, mode, 0, 1)) /* write equation */
  1063.         return(-1);
  1064.     }
  1065.  
  1066.       }
  1067.  
  1068.  
  1069.  
  1070.       if (JedecGALType == GAL22V10) {
  1071.  
  1072.     if (Jedec.GALS1[olmc]) {        /* get type of output */
  1073.       if (AddString(&buff, (UBYTE *)".T = "))
  1074.         return(-1);
  1075.     }
  1076.     else
  1077.       if (AddString(&buff, (UBYTE *)".R = "))
  1078.         return(-1);
  1079.  
  1080.                         /* write output's equation */
  1081.         if (MakeEquation(&buff, olmc, colsize, 0, 1, OLMCSize22V10[olmc]))
  1082.           return(-1);
  1083.  
  1084.                         /* write equation of */
  1085.                         /* tristate control  */
  1086.     if (AddString(&buff, ptr))            /* write pin name */
  1087.       return(-1);
  1088.  
  1089.     if (AddString(&buff, (UBYTE *)".E = "))          /* tristate enable */
  1090.       return(-1);
  1091.  
  1092.     if (MakeEquation(&buff, olmc, colsize, mode, 0, 1)) /* write equation */
  1093.       return(-1);
  1094.  
  1095.       }
  1096.  
  1097.  
  1098.  
  1099.       if (JedecGALType == GAL20RA10) {
  1100.                         /* write equation of output */
  1101.     if (RowActive(ToOLMC20RA10[9 - olmc] + 2, JedecGALType) == 2 &&
  1102.         RowActive(ToOLMC20RA10[9 - olmc] + 3, JedecGALType) == 2) {
  1103.       if (AddString(&buff, (UBYTE *)" = "))        /* if ARST and APRST */
  1104.         return(-1);                    /* = VCC, then */
  1105.     }                        /* tristate output */
  1106.     else {
  1107.       if (AddString(&buff, (UBYTE *)".R = "))
  1108.         return(-1);
  1109.     }
  1110.  
  1111.         if (MakeEquation(&buff, olmc, colsize, 0, 4, 4))
  1112.           return(-1);
  1113.  
  1114.  
  1115.     if (AddString(&buff, ptr))            /* write equation of */
  1116.       return(-1);                    /* tristate enable   */
  1117.  
  1118.     if (AddString(&buff, (UBYTE *)".E = "))
  1119.       return(-1);
  1120.  
  1121.     if (MakeEquation(&buff, olmc, colsize, 0, 0, 1))
  1122.       return(-1);
  1123.  
  1124.  
  1125.     if (RowActive(olmc * 8 + 1, JedecGALType)) {
  1126.       if (AddString(&buff, ptr))            /* write equation of */
  1127.         return(-1);                    /* Clock */
  1128.  
  1129.       if (AddString(&buff, (UBYTE *)".CLK = "))
  1130.         return(-1);
  1131.  
  1132.       if (MakeEquation(&buff, olmc, colsize, 0, 1, 1))
  1133.         return(-1);
  1134.     }
  1135.  
  1136.  
  1137.     if (RowActive(olmc * 8 + 2, JedecGALType)) {
  1138.       if (AddString(&buff, ptr))            /* write equation of */
  1139.         return(-1);                    /* asynchronous reset */
  1140.  
  1141.       if (AddString(&buff, (UBYTE *)".ARST = "))
  1142.         return(-1);
  1143.  
  1144.       if (MakeEquation(&buff, olmc, colsize, 0, 2, 1))
  1145.         return(-1);
  1146.     }
  1147.  
  1148.  
  1149.     if (RowActive(olmc * 8 + 3, JedecGALType)) {
  1150.       if (AddString(&buff, ptr))            /* write equation of */
  1151.         return(-1);                    /* asynchronous preset */
  1152.  
  1153.       if (AddString(&buff, (UBYTE *)".APRST = "))
  1154.         return(-1);
  1155.  
  1156.       if (MakeEquation(&buff, olmc, colsize, 0, 3, 1))
  1157.         return(-1);
  1158.     }
  1159.       }
  1160.  
  1161.  
  1162.     }
  1163.   }
  1164.  
  1165.  
  1166.                     /*** write asynchronous reset and ***/
  1167.                     /*** synchronous preset       ***/
  1168.   if (JedecGALType == GAL22V10) {
  1169.  
  1170.     if (RowActive(0, JedecGALType)) {
  1171.       if (AddString(&buff, (UBYTE *)"AR = "))      /* asyn. reset */
  1172.         return(-1);
  1173.  
  1174.       if (MakeEquation(&buff, olmc, colsize, 4, 0, 1))
  1175.         return(-1);
  1176.     }
  1177.  
  1178.     if (RowActive(131, JedecGALType)) {
  1179.       if (AddString(&buff, (UBYTE *)"SP = "))      /* synch. preset */
  1180.         return(-1);
  1181.  
  1182.       if (MakeEquation(&buff, olmc, colsize, 5, 0, 1))
  1183.         return(-1);
  1184.     }
  1185.  
  1186.   }
  1187.  
  1188.                     /*** write ending text ***/
  1189.  
  1190.   if (AddString(&buff,"DESCRIPTION:\nThis is a reassembled file. Used JEDEC file: '"))
  1191.     return(-1);
  1192.  
  1193.   if (AddString(&buff, (UBYTE *)&filename[0]))
  1194.     return(-1);
  1195.  
  1196.   if (AddString(&buff, (UBYTE *)"'\n\n"))
  1197.     return(-1);
  1198.  
  1199.   return(0);                /* no errors, finish*/
  1200. }
  1201.  
  1202.  
  1203.  
  1204.  
  1205.  
  1206. /*Reassembler: reassemble JEDEC file and generate source file
  1207. */
  1208. void Reassembler(void)
  1209. {
  1210. struct    Buffer        *reasm_buff;
  1211. struct    ActBuffer    mybuff;
  1212. BPTR     fh;
  1213. UBYTE    *filebuffer, *filebuffer2;
  1214. int    result;
  1215.  
  1216.  if (MyFileReq(AppStrings[MSG_LOADJED].as_Str, ".jed", YES, LOAD)) {
  1217.    if (!(GetJedec((UBYTE *)&path[0]))) {    /*JEDEC-File holen*/
  1218.  
  1219.      if (PinNameRequester(JedecGALType))
  1220.        return;
  1221.  
  1222.  
  1223.      if (!(reasm_buff = (struct Buffer *)AllocMem((long)sizeof(struct Buffer),MEMF_PUBLIC|MEMF_CLEAR))) {
  1224.        ErrorReq(2);            /*kein Speicher mehr->Fehlermeldung*/
  1225.        return;
  1226.      }
  1227.      mybuff.ThisBuff = reasm_buff;
  1228.      mybuff.Entry    = (UBYTE *)(&reasm_buff->Entries[0]);
  1229.      mybuff.BuffEnd  = (UBYTE *)reasm_buff + (long)sizeof(struct Buffer);
  1230.  
  1231.  
  1232.      if (!Reasm(mybuff) && MyFileReq(AppStrings[MSG_WRITE_SOURCE].as_Str, ".pld", YES, SAVE)) {
  1233.        PrintText(AppStrings[MSG_WRITING_SOURCE].as_Str, 1);
  1234.        if ((fh = Open(&path[0], (long)MODE_NEWFILE))) {
  1235.          for (;;) {
  1236.        filebuffer = filebuffer2 = mybuff.Entry;
  1237.  
  1238.        while (filebuffer2 < mybuff.BuffEnd) {    /*Größe des Puffers bestimmen*/
  1239.          if (!*filebuffer2) 
  1240.            break;
  1241.              filebuffer2++;
  1242.        }
  1243.                         /*Puffer schreiben*/
  1244.        result = Write(fh, (char *)filebuffer, (long)(filebuffer2-filebuffer));
  1245.        if (result == -1L) {            /*Fehler beim Schreiben?*/
  1246.          Close(fh);                /*ja, dann Ende*/
  1247.          FreeBuffer(reasm_buff);
  1248.          PrintText(AppStrings[MSG_ERROR].as_Str, 0);
  1249.          ErrorReq(13);
  1250.          return;
  1251.        }
  1252.  
  1253.        if (!mybuff.ThisBuff->Next)        /*noch ein Puffer da?*/
  1254.          break;                    /*nein, dann for(;;)-Ende*/
  1255.        mybuff.ThisBuff = mybuff.ThisBuff->Next;
  1256.        mybuff.Entry    = (UBYTE *)(&mybuff.ThisBuff->Entries[0]);
  1257.        mybuff.BuffEnd  = (UBYTE *)mybuff.ThisBuff + (long)sizeof(struct Buffer);
  1258.          }
  1259.          Close(fh);
  1260.        }
  1261.        else {
  1262.          FreeBuffer(reasm_buff);        /*Fehler?, dann Abbruch*/
  1263.          PrintText(AppStrings[MSG_ERROR].as_Str, 0);
  1264.          ErrorReq(13);            /*Datei läßt sich nicht öffnen*/
  1265.          return;
  1266.        }
  1267.  
  1268.        PrintText(AppStrings[MSG_LOWER_OK].as_Str, 0);
  1269.      }
  1270.      FreeBuffer(reasm_buff);            /*Speicher freigeben*/
  1271.    }
  1272.  }
  1273. }
  1274.  
  1275.  
  1276.  
  1277. /* print error messages
  1278. */
  1279. void ReasmError(int errornum, int pinnum)
  1280. {
  1281. char    string[40];
  1282.  
  1283.  switch (errornum) {
  1284.    case  1:
  1285.      MyRequest(ERR_REQ, AppStrings[MSG_REASM_ERR].as_Str);
  1286.      PrintText(AppStrings[MSG_ERR_REASM1].as_Str, 1);
  1287.      break;
  1288.  
  1289.    case  2:
  1290.      strcpy(string, AppStrings[MSG_ERR_REASM2].as_Str);
  1291.      sprintf(&string[4], "%2d", pinnum);
  1292.      string[6] = ':';
  1293.      MyRequest(ERR_REQ, string);
  1294.      break;
  1295.  
  1296.    case  3:
  1297.      strcpy(string, AppStrings[MSG_ERR_REASM3].as_Str);
  1298.      sprintf(&string[4], "%2d", pinnum);
  1299.      string[6] = ':';
  1300.      MyRequest(ERR_REQ, string);
  1301.      break;
  1302.  
  1303.    case  4:
  1304.      strcpy(string, AppStrings[MSG_ERR_REASM4].as_Str);
  1305.      sprintf(&string[4], "%2d", pinnum);
  1306.      string[6] = ':';
  1307.      MyRequest(ERR_REQ, string);
  1308.      break;
  1309.  
  1310.    case  5:
  1311.      strcpy(string, AppStrings[MSG_ERR_REASM5].as_Str);
  1312.      sprintf(&string[4], "%2d", pinnum);
  1313.      string[6] = ':';
  1314.      MyRequest(ERR_REQ, string);
  1315.      break;
  1316.  
  1317.    case  6:
  1318.      strcpy(string, AppStrings[MSG_ERR_REASM6].as_Str);
  1319.      sprintf(&string[4], "%2d", pinnum);
  1320.      string[6] = ':';
  1321.      MyRequest(ERR_REQ, string);
  1322.      break;
  1323.  
  1324.    case  7:
  1325.      strcpy(string, AppStrings[MSG_ERR_REASM7].as_Str);
  1326.      sprintf(&string[4], "%2d", pinnum);
  1327.      string[6] = ':';
  1328.      MyRequest(ERR_REQ, string);
  1329.      break;
  1330.  
  1331.    case  8:
  1332.      strcpy(string, AppStrings[MSG_ERR_REASM8].as_Str);
  1333.      sprintf(&string[4], "%2d", pinnum);
  1334.      string[6] = ':';
  1335.      MyRequest(ERR_REQ, string);
  1336.      break;
  1337.  
  1338.    case  9:
  1339.      strcpy(string, AppStrings[MSG_ERR_REASM9].as_Str);
  1340.      sprintf(&string[4], "%2d", pinnum);
  1341.      string[6] = ':';
  1342.      MyRequest(ERR_REQ, string);
  1343.      break;
  1344.  
  1345.    case 10:
  1346.      strcpy(string, AppStrings[MSG_ERR_REASM10].as_Str);
  1347.      sprintf(&string[4], "%2d", pinnum);
  1348.      string[6] = ':';
  1349.      MyRequest(ERR_REQ, string);
  1350.      break;
  1351.  
  1352.  }
  1353. }
  1354.  
  1355.  
  1356.  
  1357.  
  1358.